package com.xuhai.blog.common.util;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

/**
 * @Author PangJunjie
 * @Date 2022/2/8/008
 */
public class AutoCode {
    /*声明资源读取器*/
    private static ResourceBundle rb;
    /*使用静态代码块来自动加载静态资源*/
    static {
        /*加载数据源配置文件*/
        rb=ResourceBundle.getBundle("application-db");
    }

    /*获取数据库连接地址*/
    private final static String URL=rb.getString("jdbc.url");
    /*获取数据库驱动器*/
    private final static String DRIVER= rb.getString("jdbc.driver");
    /*获取数据库用户名*/
    private final static String USERNAME=rb.getString("jdbc.username");
    /*获取数据库密码*/
    private final static String PASSWORD=rb.getString("jdbc.password");

    /*获取项目根路径*/
    private final static String PROJECT_PATH=System.getProperty("user.dir");


    public static void main(String[] args) {
        /*初始化代码生成器*/
        AutoGenerator autoGenerator = new AutoGenerator();

        /*初始化数据库配置信息类*/
        DataSourceConfig dataSourceConfig=new DataSourceConfig();
        /*配置数据库信息*/
        dataSourceConfig.setUrl(URL);
        dataSourceConfig.setDriverName(DRIVER);
        dataSourceConfig.setUsername(USERNAME);
        dataSourceConfig.setPassword(PASSWORD);
        /*指定数据库*/
        dataSourceConfig.setDbType(DbType.MYSQL);
        /*自定义数据类型*/
        dataSourceConfig.setTypeConvert(new MySqlTypeConvert(){
            @Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                /*mysql中包含date的类型则进行单独的转换*/
                if(fieldType.toLowerCase().contains("date")){
                    return DbColumnType.DATE;
                }
                return super.processTypeConvert(globalConfig, fieldType);
            }
        });


        /*装载数据源到生成器*/
        autoGenerator.setDataSource(dataSourceConfig);

        /*初始化全局配置信息类*/
        GlobalConfig globalConfig=new GlobalConfig();
        /*设置输出路径*/
        globalConfig.setOutputDir(PROJECT_PATH+"/blog/src/main/java");
        /*设置作者，非必要*/
        globalConfig.setAuthor("机蜂");
        /*取消自动打开文件夹*/
        globalConfig.setOpen(false);
        /*取消重复生成覆盖文件的行为*/
        globalConfig.setFileOverride(false);
        /*设置主键策略*/
        globalConfig.setIdType(IdType.AUTO);
        /*设置实体类名称格式,非必要(目前的设置和默认的设置是一致)*/
        globalConfig.setEntityName("%sEntity");
        /*设置mapper接口名称格式,非必要(目前的设置和默认的设置是一致)*/
        globalConfig.setMapperName("%sMapper");
        /*设置控制器接口名称格式,非必要(目前的设置和默认的设置是一致)*/
        globalConfig.setControllerName("%sController");
        /*设置服务类接口名称格式,必须设置，否则默认生成的接口名称会多一个I*/
        globalConfig.setServiceName("%sService");
        /*设置服务实现类名称格式，必须设置*/
        globalConfig.setServiceImplName("%sServiceImpl");

        /*装配全局配置信息到执行器*/
        autoGenerator.setGlobalConfig(globalConfig);

        /*初始化包配置类*/
        PackageConfig packageConfig=new PackageConfig();
        /*设置统一的父级路径*/
        packageConfig
                .setParent("com.xuhai.blog.admin")
                .setEntity("entity")
                .setMapper("mapper")
                .setController("controller")
                .setService("service")
                .setServiceImpl("service.impl");
//        packageConfig.setEntity("entity");
//        packageConfig.setMapper("mapper");
//        packageConfig.setController("controller");
//        packageConfig.setService("service");
//        packageConfig.setServiceImpl("service.impl");

        /*装载包配置到执行器*/
        autoGenerator.setPackageInfo(packageConfig);

        /*初始化策略配置类*/
        StrategyConfig strategyConfig = new StrategyConfig();
        /*关闭全局大写*/
        strategyConfig.setCapitalMode(false);
        /*配置表名和实体类名的映射关系：表名中的下划线(_)转换为驼峰命名法，但是类名的首字母是要求大写的，所以这个转换不是标准的驼峰命名*/
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        /*设置表中字段和实体类属性名的映射关系，字段中的下划线(_)转换为驼峰命名法*/
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
        /*配置需要被忽略的表名前缀*/
        strategyConfig.setTablePrefix("sys_","bl_");
        /*设置实体类使用lombok*/
        strategyConfig.setEntityLombokModel(true);
        /*设置控制器使用RestController注解*/
        strategyConfig.setRestControllerStyle(true);
        /*设置生成的实体类是否自动加注解*/
        strategyConfig.setEntityTableFieldAnnotationEnable(true);
        /*执行要生成的表，注释掉该代码则表示生成所有表*/
//        strategyConfig.setInclude("sys_user");

        /*装载策略到生成器*/
        autoGenerator.setStrategy(strategyConfig);

        /*初始化模板配置类*/
        TemplateConfig templateConfig=new TemplateConfig();
        /*设置mapper.xml禁止输出到mapper包*/
        templateConfig.setXml(null);

        /*装载模板到生成器*/
        autoGenerator.setTemplate(templateConfig);


        /*初始化自定义配置*/
        InjectionConfig injectionConfig=new InjectionConfig() {
            @Override
            public void initMap() {

            }
        };

        /*初始化文件输出解决方案集合*/
        List<FileOutConfig> focList=new ArrayList<>();
        /*声明模板*/
        String templatePath="/templates/mapper.xml.vm";
        /*添加自定义配置*/
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return PROJECT_PATH+"/blog/src/main/resources/mapper/"+tableInfo.getMapperName()+ StringPool.DOT_XML;
            }
        });

        /*装载解决方案到自定义配置*/
        injectionConfig.setFileOutConfigList(focList);

        /*装载自定义配置到生成器*/
        autoGenerator.setCfg(injectionConfig);

        /*生成代码*/
        autoGenerator.execute();
    }
}
